package com.simple.elpmobile.onlinecase.ui.base;


import com.simple.elpmobile.onlinecase.R;
import com.simple.elpmobile.onlinecase.engine.AppEngine;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnKeyListener;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;


/**
 * @author jgzheng
 * @description 封装的对话框，提供应用中所有对话框的显示，消失操作
 */
public abstract class MessageBox
{

    /**
     * 双按钮提示框
     * 
     * @param context 上下文
     * @param contentId 提示内容
     * @param leftHandler 左按钮点击事件，NULL为不处理点击事件
     * @param rightHandler 右按钮点击事件，NULL为不处理点击事件
     */
    public static synchronized void showInfo(Context context, int contentId,
            MessageBoxHandler leftHandler, MessageBoxHandler rightHandler)
    {
        showInfo(context, context.getString(contentId), leftHandler,
                rightHandler);
    }

    /**
     * 双按钮提示框
     * 
     * @param context 上下文
     * @param content 提示内容
     * @param title 标题名字，传入null用默认的“提示”标题
     * @param left 左按钮名字
     * @param right 右按钮名字
     * @param leftHandler 左按钮点击事件，NULL为不处理点击事件
     * @param rightHandler 右按钮点击事件，NULL为不处理点击事件
     * @return 对话框实例
     */
    public static synchronized DefineDialog showInfo(final Context context,
            String title, String left, String right, String content,
            MessageBoxHandler leftHandler, MessageBoxHandler rightHandler)
    {
        View view = LayoutInflater.from(context).inflate(
                R.layout.dialog_extra_text, null);
        ((TextView) view.findViewById(R.id.extra_text)).setText(content);
        DefineDialog dialog = alertDialog(context, title, left, leftHandler,
                right, rightHandler, view);
        dialog.setCancelable(true);
        dialog.show();
        return dialog;
    }
    
    /**
     * 双按钮提示框
     * 
     * @param context 上下文
     * @param content 提示内容
     * @param title 标题名字，传入null用默认的“提示”标题
     * @param left 左按钮名字
     * @param right 右按钮名字
     * @param leftHandler 左按钮点击事件，NULL为不处理点击事件
     * @param rightHandler 右按钮点击事件，NULL为不处理点击事件
     * @param isExit 添加一个参数与上面的方法做区分，次方法点击返回不退出
     * @return 对话框实例
     * 
     */
    public static synchronized DefineDialog showInfo(final Context context,
            String title, String left, String right, String content,
            MessageBoxHandler leftHandler, MessageBoxHandler rightHandler,Boolean isExit)
    {
        View view = LayoutInflater.from(context).inflate(
                R.layout.dialog_extra_text, null);
        ((TextView) view.findViewById(R.id.extra_text)).setText(content);
        DefineDialog dialog = alertDialog(context, title, left, leftHandler,
                right, rightHandler, view);   
        if (isExit) {
        	 dialog.setOnKeyListener(new OnKeyListener()
             {
                 public boolean onKey(DialogInterface dialog,
                         int keyCode, KeyEvent event)
                 {
                     if (keyCode == KeyEvent.KEYCODE_BACK)
                     {
                         dialog.dismiss();
                         AppEngine.quitApplication(context);
                         return true;
                     }
                     else
                     {
                         return false;
                     }
                 }
             });
		}
        dialog.setCancelable(true);
        dialog.show();
        return dialog;
    }

    
    
    /**
     * 双按钮提示框
     * 
     * @param context 上下文
     * @param content 提示内容
     * @param leftHandler 左按钮点击事件，NULL为不处理点击事件
     * @param rightHandler 右按钮点击事件，NULL为不处理点击事件
     */
    public static synchronized void showInfo(Context context, String content,
            MessageBoxHandler leftHandler, MessageBoxHandler rightHandler)
    {
        View view = LayoutInflater.from(context).inflate(
                R.layout.dialog_extra_text, null);
        ((TextView) view.findViewById(R.id.extra_text)).setText(content);
        alertDialog(context, context.getString(R.string.dialog_YES),
                leftHandler, context.getString(R.string.dialog_CANCEL),
                rightHandler, view).show();
    }

    /**
     * 单按钮提示框
     * 
     * @param context 上下文
     * @param content 提示内容
     */
    public static synchronized void showInfo(Context context, String content)
    {
        View view = LayoutInflater.from(context).inflate(
                R.layout.dialog_extra_text, null);
        ((TextView) view.findViewById(R.id.extra_text)).setText(content);
        alertDialog(context, context.getString(R.string.dialog_YES), null,
                null, null, view).show();
    }
    
    /**
     * 单按钮提示框
     * 
     * @param context 上下文
     * @param content 提示内容
     * @param handler 点击事件
     */
    public static synchronized void showInfo(Context context, String content, MessageBoxHandler handler)
    {
        View view = LayoutInflater.from(context).inflate(
                R.layout.dialog_extra_text, null);
        ((TextView) view.findViewById(R.id.extra_text)).setText(content);
        alertDialog(context, context.getString(R.string.dialog_YES), handler,
                null, null, view).show();
    }

    /**
     * 单按钮提示框
     * 
     * @param context 上下文
     * @param contentId 提示内容ResId
     */
    public static synchronized void showInfo(Context context, int contentId)
    {
        showInfo(context, context.getString(contentId));
    }
    

    /**
     * 自定义显示对话框
     * 
     * @param context 上下文
     * @param leftButton 左按钮
     * @param leftHandler 左按钮点击事件
     * @param rightButton 右按钮
     * @param rightHandler 右按钮点击事件
     * @param view 中间显示内容
     * @return 对话框实例
     */
    private static synchronized DefineDialog alertDialog(Context context,
            String leftButton, MessageBoxHandler leftHandler,
            String rightButton, MessageBoxHandler rightHandler, View view)
    {
        DefineDialog dialog = new DefineDialog(context);
        dialog.setLeftButton(leftButton, leftHandler);
        dialog.setRightButton(rightButton, rightHandler);
        dialog.addExtraView(view);
        return dialog;
    }

    /**
     * 自定义显示对话框
     * 
     * @param context 上下文
     * @param title 标题内容
     * @param leftButton 左按钮
     * @param leftHandler 左按钮点击事件
     * @param rightButton 右按钮
     * @param rightHandler 右按钮点击事件
     * @param view 中间显示内容
     * @return 对话框实例
     */
    private static synchronized DefineDialog alertDialog(Context context,
            String title, String leftButton, MessageBoxHandler leftHandler,
            String rightButton, MessageBoxHandler rightHandler, View view)
    {
        DefineDialog dialog = new DefineDialog(context);
        if (title != null && !"".equals(title))
        {
            ((TextView) dialog.findViewById(R.id.title)).setText(title);
        }
        dialog.setLeftButton(leftButton, leftHandler);
        dialog.setRightButton(rightButton, rightHandler);
        dialog.addExtraView(view);
        return dialog;
    }
    
    /**
     * 自定义的对话框
     * 
     * @author Tiny
     * @version [版本号, 2012-4-26]
     */
    public static class DefineDialog extends Dialog
    {

        /**
         * 左按钮
         */
        private Button leftButton;

        /**
         * 右按钮
         */
        private Button rightButton;

        /**
         * 中间布局
         */
        private LinearLayout extraLayout;

        /**
         * 中间View
         */
        private View extraView;

        /**
         * 默认构造方法
         * 
         * @param context 上下文
         */
        protected DefineDialog(Context context)
        {
            super(context, R.style.AlertDlgStyle);

            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.dialog);

            leftButton = (Button) findViewById(R.id.dialog_left);
            rightButton = (Button) findViewById(R.id.dialog_right);
            extraLayout = (LinearLayout) findViewById(R.id.dialog_extra_layout);
        }        
        
        /**
         * 添加中间显示区域
         * 
         * @param view View
         */
        private void addExtraView(View view)
        {
            extraLayout.removeAllViews();
            extraLayout.addView(view);
            this.extraView = view;
        }

        /**
         * 设置显示左按钮
         * 
         * @param text 按钮名称
         * @param handler 按钮响应事件，null为默认响应事件
         */
        private void setLeftButton(String text, final MessageBoxHandler handler)
        {
            if (text == null)
            {
                leftButton.setVisibility(View.GONE);
                return;
            }
            else
            {
                leftButton.setVisibility(View.VISIBLE);            	
            }
            
            leftButton.setText(text);
            leftButton.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    DefineDialog.this.dismiss();
                    if (handler != null)
                    {
                        handler.commandHandler();
                    }
                }
            });
        }

        /**
         * 设置显示右按钮
         * 
         * @param text 按钮名称
         * @param handler 按钮响应事件，null为默认响应事件
         */
        private void setRightButton(String text, final MessageBoxHandler handler)
        {
            if (text == null)
            {
                rightButton.setVisibility(View.GONE);
                return;
            }
            else
            {
            	rightButton.setVisibility(View.VISIBLE);            	
            }
            
            rightButton.setText(text);
            rightButton.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    DefineDialog.this.dismiss();
                    if (handler != null)
                    {
                        handler.commandHandler();
                    }
                }
            });
        }

        /**
         * 获取左按钮
         * 
         * @return 左按钮
         */
        public Button getLeftButton()
        {
            return leftButton;
        }

        /**
         * 获取右按钮
         * 
         * @return 右按钮
         */
        public Button getRightButton()
        {
            return rightButton;
        }

        /**
         * 获取中间显示区域
         * 
         * @return 中间显示区域
         */
        public View getExtraView()
        {
            return extraView;
        }

    }
    
    public static abstract class MessageBoxHandler
    {
        /**
         * 默认回调接口
         */
        public void commandHandler()
        {

        }

        /**
         * 带内容的回调接口
         * 
         * @param content 内容
         * @param cursor 内容位置
         */
        public void commandHandler(String content, int cursor)
        {

        }

        /**
         * 带标记的回调接口
         * 
         * @param isCheck 是否标记
         */
        public void commandHandler(boolean isCheck)
        {

        }
    }
}
